package com.zhyt.intelligentpipeline.util.calc;
public class Cracksafety {
    /**
     *
     * @param a 裂纹短半袖（裂纹深度），mm
     * @param c 裂纹长半袖（裂纹半长） mm
     * @param O 裂纹中心处与裂纹前缘点的角度
     * @param R 管道内径 mm
     * @param t 管道壁厚  mm
     * @param t_ 裂纹倾斜角度  0°<=t-<=90°
     * @param P 管道运行压力 MPa
     * @param σ_y 管材的最小屈服强度
     * @param y_c 断裂韧度 mm
     * @param E 弹性模量 Mpa
     * @param V 泊松比，无量纲。（0.3）
     * @param type 输入类别 0表示输入外表面裂纹，1表示输入内表面裂纹
     * @return 韧性比K_r
     */
    public static double getStressintensityfactor_k_r(double a,double c,double O,double R,double t,double t_,double P,double σ_y,double y_c,double E,double V,int type){
        double radian_O=O*Math.PI/180;
        double kk=a/c;
        double E_k=Math.pow((1+1.464*Math.pow(kk,1.65)),0.5);  // 5-20
        double M1=1.13-0.09*kk; //5-22
        double M2=-0.54+0.89/(0.2+kk);
        double M3=0.5-1/(0.65+kk)+14*Math.pow((1-kk),24);
        double g_0=1+(0.1+0.35*Math.pow(kk,2))*(1-Math.sin(radian_O));
        double f_0=Math.pow(Math.pow(Math.sin(radian_O),2)+Math.pow(kk,2)*Math.pow(Math.cos(radian_O),2),0.25);
        double R_0 = R+t;
        double h;
        if (type==0)
        {
            h=((R_0*R_0+R*R)/(R_0*R_0-R*R)-1+0.5*Math.sqrt(a/t))*t/R;
        }
        else{
            h=((R_0*R_0+R*R)/(R_0*R_0-R*R)+1-0.5*Math.sqrt(a/t))*t/R;
        }
        double w_t_ = 7.616*0.001-2.137*0.001*t_+4.174*0.0001*t_*t_-3.008*0.000001*t_*t_*t_;
        double F1=0.97*(M1+M2*Math.pow(kk,2)+M3*Math.pow(kk,4))*g_0*f_0*h;  //5-21
        double K_I = P*R*Math.sqrt(Math.PI*a)/t*E_k*F1*w_t_;
        double K_IC=Math.sqrt(1.5*σ_y*y_c*E/(1-V*V));
        double K_r=K_I/K_IC;
        return K_r;  //韧性比K_r
    }


    /**
     *
     * @param a 裂纹短半袖（裂纹深度），mm
     * @param t 管道壁厚  mm
     * @param c 裂纹长半袖（裂纹半长） mm
     * @param R 管道内径 mm
     * @param P 管道运行压力 MPa
     * @param σ_y 管材的最小屈服强度  MPa
     * @return 载荷比 L_r
     */
    public static double get_LoadRatio_L_r(double a,double t,double c,double R,double P,double σ_y){
        double R_0=R+t;
        double kk = a/t;
        double α = kk/(1+t/c);
        double g=1-20*Math.pow((a/2*c),0.75)*Math.pow(α,3);
        double λ_a=1.818*c/Math.sqrt(R*α);
        double M_s=1/(1-kk+kk*λ_a);
        double M_t=Math.sqrt(1+0.4845*λ_a*λ_a);
        double P_m=P*R/t;
        double P_b=P*R_0*R_0/(R_0*R_0-R*R)*(t/R-3/2*t/R*t/R+9/5*Math.pow(t/R,3));
        double σ_ref=g*P_b+Math.sqrt((Math.pow(g*P_b,2))+9*Math.pow((M_s*P_m*(1-α)*(1-α)),2));
        double L_r=σ_ref/σ_y;
        return L_r;
    }

    /**
     *
     * @param σ_u 管材最小抗拉强度  MPa
     * @param σ_y 管材的最小屈服强度  MPa
     * @return  L_max为评估曲线的截止线
     */
    public static double get_L_max(double σ_u,double σ_y){
        double L_max=(σ_u+σ_y)/(2*σ_y);
        return L_max;
    }

    /**
     *
     * @param L_r 载荷比
     * @return 失效评估曲线 f(L_r)
     */
    public static double get_f(double L_r){
        double f_L_r=(1-0.14*L_r*L_r)*(0.3+0.7*Math.pow(Math.E,-0.65*Math.pow(L_r,6)));
        return f_L_r;
    }
}
